package compilador.tratamentoDeErro;

import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import compilador.analisadorLexico.Simbolo;

public class SimbolosIniciais {
	private TreeMap <String, Set<Integer>> simbolosIniciais;

	public SimbolosIniciais() {
		this.simbolosIniciais = new TreeMap<String, Set<Integer>>();
	}

	public Set<Integer> getInicio(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("<%")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_OPERADOR_INICIO_PROGRAMA);
			simbolosIniciais.put("<%", S1);
		}

		return simbolosIniciais.get("<%");
	}

	public Set<Integer> getCorpo(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("corpo")){
			s1 = new TreeSet<Integer>();
			s1.addAll(getComandoSaida());
			s1.addAll(getDeclaracaoVariavel());
			s1.addAll(getDeclaracaoConstante());
			s1.addAll(getDeclaracaoMetodo());
			s1.addAll(getComandoAtribuicao());
			s1.addAll(getComandoCondicional());
			s1.addAll(getComandoLoop());
			s1.addAll(getFim());
//			s1.addAll(getComandoEntrada());

			simbolosIniciais.put("corpo", s1);
		}

		return simbolosIniciais.get("corpo");
	}

	public Set<Integer> getFim(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("%>")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_OPERADOR_TERMINO_PROGRAMA);
			simbolosIniciais.put("%>", s1);
		}

		return simbolosIniciais.get("%>");
	}

	public Set<Integer> getComandoSaida(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoSaida")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_SOUT);
			simbolosIniciais.put("comandoSaida", s1);
		}

		return simbolosIniciais.get("comandoSaida");
	}

	public Set<Integer> getComandoEntrada(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("comandoEntrada")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_PALAVRACHAVE_SOUT);
			simbolosIniciais.put("comandoEntrada", S1);
		}

		return simbolosIniciais.get("comandoEntrada");
	}

	public Set<Integer> getComandoAtribuicao(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("comandoAtribuicao")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_IDENTIFICADOR);
			simbolosIniciais.put("comandoAtribuicao", S1);
		}

		return simbolosIniciais.get("comandoAtribuicao");
	}

	public Set<Integer> getComandoAtribuicaoIgual(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoAtribuicaoIgual")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_OPERADOR_ATRIBUICAO);
			simbolosIniciais.put("comandoAtribuicaoIgual", s1);
		}

		return simbolosIniciais.get("comandoAtribuicaoIgual");
	}

	public Set<Integer> getComandoAtribuicaoLadoDireito(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoAtribuicaoLadoDireito")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_NUMERO);
			s1.add(Simbolo.CODIGO_CADEIA_CARACTERES);
			s1.add(Simbolo.CODIGO_IDENTIFICADOR);
			simbolosIniciais.put("comandoAtribuicaoLadoDireito", s1);
		}

		return simbolosIniciais.get("comandoAtribuicaoLadoDireito");
	}

	public Set<Integer> getComandoAtribuicaoVetor(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoAtribuicaoVetor")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PARENTISACAO_FECHA_COLCHETE);
			simbolosIniciais.put("comandoAtribuicaoVetor", s1);
		}

		return simbolosIniciais.get("comandoAtribuicaoVetor");
	}

	public Set<Integer> getComandoCondicional(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("comandoCondicional")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_PALAVRACHAVE_IF);
			simbolosIniciais.put("comandoCondicional", S1);
		}

		return simbolosIniciais.get("comandoCondicional");
	}

	public Set<Integer> getComandoCondicionalFim(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoCondicionalFim")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_ENDIF);
			simbolosIniciais.put("comandoCondicionalFim", s1);
		}

		return simbolosIniciais.get("comandoCondicionalFim");
	}

	public Set<Integer> getComandoCondicionalThen(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoCondicionalThen")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_THEN);
			simbolosIniciais.put("comandoCondicionalThen", s1);
		}

		return simbolosIniciais.get("comandoCondicionalThen");
	}

	public Set<Integer> getComandoLoop(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("comandoLoop")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_PALAVRACHAVE_WHILE);
			simbolosIniciais.put("comandoLoop", S1);
		}

		return simbolosIniciais.get("comandoLoop");
	}

	public Set<Integer> getComandoLoopFim() {
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("comandoLoopFim")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_ENDWHILE);
			simbolosIniciais.put("comandoLoopFim", s1);
		}
		return simbolosIniciais.get("comandoLoopFim");
	}

	public Set<Integer> getDeclaracaoVariavel(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("declaracaoVariavel")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_PALAVRACHAVE_DIM);
			simbolosIniciais.put("declaracaoVariavel", S1);
		}

		return simbolosIniciais.get("declaracaoVariavel");
	}

	public Set<Integer> getDeclaracaoConstante(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("declaracaoConstante")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_PALAVRACHAVE_CONST);
			simbolosIniciais.put("declaracaoConstante", S1);
		}

		return simbolosIniciais.get("declaracaoConstante");
	}

	public Set<Integer> getDeclaracaoMetodo(){
		Set<Integer> S1;
		if (!simbolosIniciais.containsKey("declaracaoMetodo")){
			S1 = new TreeSet<Integer>();
			S1.add(Simbolo.CODIGO_PALAVRACHAVE_SUB);
			simbolosIniciais.put("declaracaoMetodo", S1);
		}

		return simbolosIniciais.get("declaracaoMetodo");
	}

	public Set<Integer> getDeclaracaoMetodoFim(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("declaracaoMetodoFim")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_ENDSUB);
			simbolosIniciais.put("declaracaoMetodoFim", s1);
		}

		return simbolosIniciais.get("declaracaoMetodoFim");
	}

	public Set<Integer> getInicioSout(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("s1sout")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_IDENTIFICADOR);
			s1.add(Simbolo.CODIGO_CADEIA_CARACTERES);
			simbolosIniciais.put("s1sout", s1);
		}

		return simbolosIniciais.get("s1sout");
	}

	public Set<Integer> getEnd(){
		Set<Integer> s1;
		if (!simbolosIniciais.containsKey("end")){
			s1 = new TreeSet<Integer>();
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_ENDIF);
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_ENDSUB);
			s1.add(Simbolo.CODIGO_PALAVRACHAVE_ENDWHILE);
			simbolosIniciais.put("end", s1);
		}

		return simbolosIniciais.get("end");
	}
	
}